package com.mycompany.myjobs.repository;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;


import com.mycompany.myjobs.model.Oferta;
import com.mycompany.myjobs.model.Postulante;
import com.mycompany.myjobs.model.PostulanteOferta;
import com.mycompany.myjobs.model.Usuario;

@Repository
public class JdbcPostulanteRepository {
	
	@Autowired
	private DataSource datasource;

    Postulante postulante=new Postulante();
    
    //atributo lista de postulantes
    private ArrayList<Postulante> postulantesRegistrados;

    //constructor
    public JdbcPostulanteRepository()
    {
        postulantesRegistrados = new ArrayList<Postulante>();
    }
    
    //get lista de postulantes
    public ArrayList<Postulante> getPostulantesRegistrados(){
        return postulantesRegistrados;
    }

    //set lista de postulantes
    public void setPostulantesRegistrados(ArrayList<Postulante> postulantesRegistrados){
    	this.postulantesRegistrados=postulantesRegistrados;
    }
    

	public void grabarPostulante(Usuario usuario, Postulante postulante){
		
		String sql = "insert into T_POSTULANTE (LOGIN,DNI,EDAD,PERFIL1,PERFIL2,PERFIL3,PERFIL4) values (?, ?, ?, ?, ?, ?, ?)";
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			
						
			if (usuario.getLogin()!=null)
			{

				Postulante DniExistentePostulante=	existeDniPostulante(postulante.getDni());
				if (DniExistentePostulante.getDni()!=postulante.getDni())
					{
					conn = datasource.getConnection();
					ps = conn.prepareStatement(sql);
					ps.setString(1, usuario.getLogin());
					ps.setInt(2, postulante.getDni());
					ps.setInt(3, postulante.getEdad());
					ps.setString(4, postulante.getPerfil1());
					ps.setString(5, postulante.getPerfil2());
					ps.setString(6, postulante.getPerfil3());
					ps.setString(7, postulante.getPerfil4());
					ps.execute();//cuando la sentencia sql no es select
					}
			}

	}catch(Exception ex){
		
		
		System.out.println("Error grabar Usuario : " + ex.getMessage());
	}
	
	closeConecction(null, ps, conn);
}
	
	public List<Postulante> mostrarPostulantes(){
	    postulantesRegistrados= new ArrayList <Postulante>();
	    //TABLA POSTULANTES
		String sql = "select LOGIN,DNI,EDAD,PERFIL1,PERFIL2,PERFIL3,PERFIL4 from T_POSTULANTE";
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		//TABLA USUARIOS
		String sql2 = "select NOMBRE,CORREO,TELEFONO,DIRECCION,LOGIN,CONTRASENA from T_USUARIO where LOGIN=?";
		Connection conn2 = null;
		PreparedStatement ps2 = null;
		ResultSet rs2 = null;
		try {
			//TABLA POSTULANTES
			conn = datasource.getConnection();
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
					
			while(rs.next()){
				postulante=new Postulante();
				postulante.setLogin(rs.getString("LOGIN"));	
				postulante.setDni(rs.getInt("DNI"));
				postulante.setEdad(rs.getInt("EDAD"));
				postulante.setPerfil1(rs.getString("PERFIL1"));
				postulante.setPerfil2(rs.getString("PERFIL2"));
				postulante.setPerfil3(rs.getString("PERFIL3"));
				postulante.setPerfil4(rs.getString("PERFIL4"));

				//TABLA USUARIOS
				conn2 = datasource.getConnection();
				ps2 = conn2.prepareStatement(sql2);
				ps2.setString(1, postulante.getLogin());
				rs2 = ps2.executeQuery();
				
					while (rs2.next())
					{
						postulante.setNombre(rs2.getString("NOMBRE"));
						postulante.setCorreo(rs2.getString("CORREO"));
						postulante.setTelefono(rs2.getString("TELEFONO"));
						postulante.setDireccion(rs2.getString("DIRECCION"));
						postulante.setLogin(rs2.getString("LOGIN"));
						postulante.setContrasena(rs2.getString("CONTRASENA"));
					}
				postulantesRegistrados.add(postulante);

				
			}

	}catch(Exception ex){
		
		
		System.out.println("Error grabar Postulante : " + ex.getMessage());
	}

	closeConecction(null, ps, conn);
	
	return postulantesRegistrados;
}
	
	   public Postulante existeDniPostulante(int dni) {
	    	
		    //TABLA POSTULANTES
			String sql = "select LOGIN,DNI from T_POSTULANTE where DNI=?";
			Connection conn = null;
			PreparedStatement ps = null;
			ResultSet rs = null;
			try {
				//TABLA POSTULANTES
				conn = datasource.getConnection();
				ps = conn.prepareStatement(sql);
				ps.setInt(1, dni);
				rs = ps.executeQuery();
						
				while(rs.next()){
					postulante=new Postulante();
					postulante.setLogin(rs.getString("LOGIN"));	
					postulante.setDni(rs.getInt("DNI"));

				}

				}catch(Exception ex){
					
					
					System.out.println("Error grabar Postulante : " + ex.getMessage());
				}

				closeConecction(null, ps, conn);
				
				return postulante;

	    }
	   
	   //POSTULANTES EN OFERTA
		public void registrarPostulanteEnOferta(Usuario usuario, Postulante postulante, Oferta oferta){
			 //Postulantes a registrar

			 this.grabarPostulante(usuario,postulante);
			 this.grabarPostulanteOferta(usuario,oferta);
//			 this.postulantesRegistrados=this.getPostulantesRegistrados();

		}
		
		private void grabarPostulanteOferta(Usuario usuario, Oferta oferta){
			String sql = "insert into T_OFERTA_POSTULANTE(ID,LOGIN) values (?, ?)";
			Connection conn = null;
			PreparedStatement ps = null;
			try {
				
				if (usuario.getLogin()!=null&&oferta.getId()!=0)
				{

						conn = datasource.getConnection();
						ps = conn.prepareStatement(sql);
						ps.setInt(1, oferta.getId());
						ps.setString(2, usuario.getLogin());
		
						ps.execute();//cuando la sentencia sql no es select

				}
		}catch(Exception ex){
			System.out.println("Error grabar Postulante en Oferta : " + ex.getMessage());
		}
		
		closeConecction(null, ps, conn);
		}
	   

	//devuelve la lista de postulantes de una oferta
	public List<Postulante> encuentraPostulantesEnOferta(Oferta oferta) {

	    postulantesRegistrados= new ArrayList <Postulante>();

	    
	    //TABLA POSTULANTES DE OFERTA
		String sql = "select ID,LOGIN from T_OFERTA_POSTULANTE WHERE ID=?";
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		
	    //TABLA POSTULANTES 
		String sql2 = "select LOGIN,DNI,EDAD,PERFIL1,PERFIL2,PERFIL3,PERFIL4 from T_POSTULANTE WHERE LOGIN=?";
		Connection conn2 = null;
		PreparedStatement ps2 = null;
		ResultSet rs2 = null;
		
		//TABLA USUARIOS
		String sql3 = "select NOMBRE,CORREO,TELEFONO,DIRECCION,LOGIN,CONTRASENA from T_USUARIO where LOGIN=?";
		Connection conn3 = null;
		PreparedStatement ps3 = null;
		ResultSet rs3 = null;
		
		try{
		//TABLA POSTULANTES y OFERTAS
		conn = datasource.getConnection();
		ps = conn.prepareStatement(sql);
		ps.setInt(1, oferta.getId());
		rs = ps.executeQuery();
				
		while(rs.next()){
			PostulanteOferta postulanteOferta=new PostulanteOferta();
			postulanteOferta.setId(rs.getInt("ID"));
			postulanteOferta.setLogin(rs.getString("LOGIN"));

			//TABLA POSTULANTES
			conn2 = datasource.getConnection();
			ps2 = conn2.prepareStatement(sql2);
			ps2.setString(1, postulanteOferta.getLogin());
			rs2 = ps2.executeQuery();
			
				while (rs2.next())
				{
					postulante=new Postulante();
					postulante.setLogin(rs2.getString("LOGIN"));	
					postulante.setDni(rs2.getInt("DNI"));
					postulante.setEdad(rs2.getInt("EDAD"));
					postulante.setPerfil1(rs2.getString("PERFIL1"));
					postulante.setPerfil2(rs2.getString("PERFIL2"));
					postulante.setPerfil3(rs2.getString("PERFIL3"));
					postulante.setPerfil4(rs2.getString("PERFIL4"));
				
					//TABLA USUARIOS
					conn3 = datasource.getConnection();
					ps3 = conn3.prepareStatement(sql3);
					ps3.setString(1, postulanteOferta.getLogin());
					rs3 = ps3.executeQuery();
					
						while (rs3.next())
						{
							postulante.setNombre(rs3.getString("NOMBRE"));
							postulante.setCorreo(rs3.getString("CORREO"));
							postulante.setTelefono(rs3.getString("TELEFONO"));
							postulante.setDireccion(rs3.getString("DIRECCION"));
							postulante.setLogin(rs3.getString("LOGIN"));
							postulante.setContrasena(rs3.getString("CONTRASENA"));
						}
				}

				postulantesRegistrados.add(postulante);
			}
		}catch(Exception ex){
			System.out.println("Error obtener Postulante en Oferta : " + ex.getMessage());
		}
		closeConecction(rs, ps, conn);
		closeConecction(rs2, ps2, conn2);
		closeConecction(rs3, ps3, conn3);
		
		return postulantesRegistrados;
		
	}

	private void closeConecction(ResultSet rs, PreparedStatement ps, Connection conn) {

		if (rs != null) {
			try {
				// Close to prevent database cursor exhaustion
				rs.close();
			} catch (SQLException ex) {
			}
		}
		if (ps != null) {
			try {
				// Close to prevent database cursor exhaustion
				ps.close();
			} catch (SQLException ex) {
			}
		}
		if (conn != null) {
			try {
				// Close to prevent database connection exhaustion
				conn.close();
			} catch (SQLException ex) {
			}
		}

	}


}
